package com.yesep.learn.design.behavioral.iterator;

import com.yesep.learn.design.common.pojo.*;
import com.yesep.learn.design.common.util.*;

import java.util.*;

/**
 * 迭代器模式（Iterator Pattern）是一种行为型设计模式，它提供了一种方法顺序访问一个聚合对象中的各个元素，而又不需暴露该对象的内部表示。
 * 迭代器模式在面向对象编程中非常常见且重要，它简化了集合的遍历操作，同时增加了代码的复用性和灵活性。
 * <p>
 * 迭代器模式的核心概念
 * 迭代器模式主要包含以下几个关键角色：
 * <p>
 * 迭代器接口（Iterator）：定义了遍历元素的接口，通常包含hasNext()方法用于检查是否还有更多元素，以及next()方法用于获取下一个元素。
 * 具体迭代器（Concrete Iterator）：实现了迭代器接口，负责实际遍历集合并跟踪当前位置。
 * 聚合接口（Aggregate）：定义了创建迭代器对象的接口，通常包括一个或多个方法返回相应的迭代器。
 * 具体聚合（Concrete Aggregate）：实现了聚合接口，其中的方法返回相应的具体迭代器对象。
 * 迭代器模式的工作原理
 * 创建迭代器：当需要遍历某个聚合对象时，首先通过调用聚合对象的创建迭代器方法（如getIterator()）来获取一个迭代器对象。
 * 遍历元素：通过迭代器对象的hasNext()方法检查是否还有更多元素，如果有，则通过next()方法获取下一个元素。
 * 这个过程一直持续到hasNext()方法返回false，表示所有元素都已遍历完毕。
 * 迭代器模式的优点
 * 简化聚合对象的接口：通过引入迭代器，聚合对象不再需要暴露其内部表示，从而简化了其接口。
 * 支持多种遍历方式：可以在不修改聚合对象的前提下，通过定义不同的迭代器来实现不同的遍历策略。
 * 提供统一的遍历接口：迭代器模式为不同的聚合结构提供了一个统一的遍历接口，使得调用者可以以相同的方式遍历不同类型的集合。
 * 增加代码的复用性：迭代器可以被多个聚合对象共享，从而提高了代码的复用性。
 * 迭代器模式的应用场景
 * 迭代器模式适用于需要遍历集合对象，但又不想暴露集合内部表示的场景。在Java、Python等编程语言中，迭代器模式都有广泛的应用。
 * 例如，在Java中，java.util.Iterator接口就是迭代器模式的一个典型实现；
 * 在Python中，通过iter()函数和next()方法（或Python 3中的__next__()方法）也可以实现迭代器的功能。
 * <p>
 * 总结
 * 迭代器模式是一种非常有用且常见的设计模式，它通过引入迭代器对象来简化集合的遍历操作，同时增加了代码的复用性和灵活性。
 * 在实际开发中，我们应该充分利用迭代器模式来优化我们的代码设计。
 */
public class Main {
    public static void main(String[] args) {
        List<Goods> goodsList = DemoUtil.createGoodsList();
        IAggregate<Goods> aggregate = new GoodsAggregateImpl();
        goodsList.forEach(aggregate::add);
        IIterator<Goods> iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            Goods goods = iterator.next();
            System.out.println(goods.toString());
        }
    }
}
